
#include "gradientbutton.h"
#include <QPropertyAnimation>
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>

GradientButton::GradientButton(QWidget *parent)
    : QAbstractButton(parent)
    , filled_(false)
{
    color_ = Qt::blue;
    animation_ = new QPropertyAnimation(this, "spread");
    animation_->setDuration(200); // 动画持续时间
    animation_->setStartValue(0);
    animation_->setEndValue(width() / 2); // 动画目标为窗口的一半宽度
    connect(animation_, &QPropertyAnimation::finished, this, [this]() {
        filled_ = true;
        update();
        filled_ = true;
    });
    connect(animation_, &QPropertyAnimation::valueChanged, this, &GradientButton::valueChanged);
}

GradientButton::GradientButton(const QString &str, QWidget *parent)
    : QAbstractButton(parent)
{
    color_ = Qt::blue;
    animation_ = new QPropertyAnimation(this, "spread");
    animation_->setDuration(200); // 动画持续时间
    animation_->setStartValue(0);
    animation_->setEndValue(height() / 2); // 动画目标为窗口的一半宽度
    connect(animation_, &QPropertyAnimation::finished, this, [this]() {
        filled_ = true;
        update();
    });
    text_ = str;
    connect(animation_, &QPropertyAnimation::valueChanged, this, &GradientButton::valueChanged);
}

GradientButton::~GradientButton()
{

}

void GradientButton::enterEvent(QEvent *event)
{
    animation_->start();
    filled_ = false;
    QWidget::enterEvent(event);
}

void GradientButton::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.save();
    // 根据按钮的状态进行绘制
    if (isDown())
    {  // 如果按钮被按下
        painter.setBrush(QColor(255, 0, 0));  // 按下状态背景色：红色
        painter.setPen(QColor(0, 0, 255));    // 按下状态边框色：蓝色
    }
    else if (underMouse())
    {  // 如果鼠标悬停
        // 动态扩散过程：线性渐变
        QLinearGradient gradient(0, height() / 2, width(), height() / 2);
        gradient.setColorAt(0.5 - static_cast<double>(spread_) / height(), Qt::transparent);
        gradient.setColorAt(0.5, QColor(0, 255, 255));
        gradient.setColorAt(0.5 + static_cast<double>(spread_) / height(), Qt::transparent);

        painter.setBrush(gradient);
        painter.setPen(Qt::NoPen);
        painter.drawRoundedRect(rect(), 3, 3);
    }
    else
    {  // 正常状态
        painter.setBrush(QColor(0, 255, 0));
        painter.setPen(Qt::NoPen);
        painter.drawRoundedRect(rect(), 3, 3);
    }

    painter.restore();
    // 使用 QFontMetrics 测量文字大小
    QFontMetrics metrics(this->font());
    int textWidth = metrics.horizontalAdvance(text_); // 水平方向长度
    int textHeight = metrics.height();               // 垂直方向高度

    painter.drawText(width() / 2 - textWidth / 2.0, height() / 2 + textHeight / 2.0 - metrics.descent() , text_);
}

void GradientButton::valueChanged(const QVariant &value)
{
    // 动画开始
    update();
}
